#pragma once 
#include "Util.hpp"
#include <mutex>
using namespace shy;

namespace cloud
{

#define CONFIG_FILE "./cloud.conf"
  class Config
  {
    private:
      Config()
      {
        ReadConfigFile();
      }
      static Config* _instance;
      static std::mutex _mutex;
    private:
      int _hot_time;
      int _setver_port;
      std::string _server_ip;
      std::string _download_prefix;
      std::string _packfile_suffix;
      std::string _pack_dir;
      std::string _back_dir;
      std::string _backup_file;
      bool ReadConfigFile()
      {
         FileUtil fu(CONFIG_FILE);
         std::string body;
         if (fu.GetContent(body) == false)
         {
           std::cout << "load Config file failed" << std::endl;
           return false;
         }

         Json::Value root;
         if (jsonUtil::UnSerialize(body , root) == false)
         {
           return false;
         }
         _packfile_suffix = root["packfile_suffix"].asString();
         _hot_time = root["hot_time"].asInt();
         _setver_port = root["server_port"].asInt();
         _server_ip = root["server_ip"].asString();
         _download_prefix = root["download_prefix"].asString();
         _pack_dir = root["pack_dir"].asString();
         _back_dir = root["back_dir"].asString();
         _backup_file = root["backup_file"].asString();
         return true;
      }
    public:
      static Config* GetInstance()
      {
        if (_instance == nullptr)
        { 
          _mutex.lock();
          if (_instance == nullptr)
          {
            _instance = new Config();
          }
          _mutex.unlock();
         }
        return _instance;
      }

      int GetHotTime() 
      {
        return _hot_time;
      }

     int GetSetverPort()
     {
       return _setver_port;
     }

     std::string GetServerIP() 
     {
       return _server_ip;
     }

     std::string GetDownloadPrefix() 
     {
       return _download_prefix;
     }

     std::string GetPackfileSuffix() 
     {
      return _packfile_suffix;
     }

    std::string GetPackDir() 
    {
      return _pack_dir;
    }

    std::string GetBackDir() 
    {
      return _back_dir;
    }

    std::string GetBackupFile() 
    {
     return _backup_file;
    }
  };
  Config* Config::_instance = nullptr;
  std::mutex Config::_mutex;
}
